home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / hamradio / sgp4_pl2.zip / SGP_OUT.PAS < prev    next >
Pascal/Delphi Source File  |  1992-10-01  |  6KB  |  212 lines

  1. Unit SGP_Out;
  2. {           Author:  Dr TS Kelso }
  3. { Original Version:  1992 Aug 24 }
  4. { Current Revision:  1992 Oct 01 }
  5. {          Version:  1.50 }
  6. {        Copyright:  1992, All Rights Reserved }
  7. {$N+}
  8.  
  9. INTERFACE
  10.   Uses SGP_Math;
  11.  
  12. const
  13.   day_date  : boolean = true;
  14.   full_time : boolean = true;
  15.   N_E_W_S   : boolean = false;
  16.   D_M_S     : boolean = false;
  17.   time_res  : byte = 2;
  18.   angle_res : byte = 4;
  19.   dist_res  : byte = 3;
  20.  
  21. var
  22.   fout : text;
  23.  
  24. Procedure Output_Time(time : double);
  25. Procedure Output_ECI(time : double;
  26.                   pos,vel : vector);
  27. Procedure Output_Angle(angle : double;
  28.                    width,dec : byte;
  29.                      degrees : boolean);
  30. Procedure Output_LatLonAlt(time : double;
  31.                        geodetic : vector);
  32. Procedure Output_Obs(time : double;
  33.                       obs : vector);
  34. Procedure Output_RADec(time : double;
  35.                         obs : vector);
  36.  
  37. IMPLEMENTATION
  38.   Uses Support,SGP_Init,SGP_Time,Solar;
  39.  
  40. Procedure Output_Time(time : double);
  41.   begin
  42.   if day_date then
  43.     begin
  44.     Write(fout,Calendar_Date(time),'  ');
  45.     Write(fout,Time_of_Day(time,full_time,time_res));
  46.     end {if}
  47.   else
  48.     Write(fout,time:16:8);
  49.   end; {Procedure Output_Time}
  50.  
  51. Procedure Output_ECI(time : double;
  52.                   pos,vel : vector);
  53.   var
  54.     i : byte;
  55.   begin
  56.   Output_Time(time);
  57.   for i := 1 to 3 do
  58.     Write(fout,pos[i]:11:3);
  59.   for i := 1 to 3 do
  60.     Write(fout,vel[i]:11:6);
  61.   if show_vis then
  62.     if eclipsed then
  63.       Writeln(fout,' ECL')
  64.     else
  65.       Writeln(fout,'    ')
  66.   else
  67.     Writeln(fout);
  68.   end; {Procedure Output_ECI}
  69.  
  70. Procedure Output_Angle(angle : double;
  71.                    width,dec : byte;
  72.                      degrees : boolean);
  73.   var
  74.     asign       : shortint;
  75.     deg,min,sec : longint;
  76.     tmp         : double;
  77.   begin
  78.   if dec > 4 then
  79.     dec := 4;
  80.   if D_M_S then
  81.     begin
  82.     asign := Sign(angle);
  83.     angle := Abs(angle);
  84.     case dec of
  85.       0 : begin
  86.           angle := Modulus(angle + 0.5,360);
  87.           deg := asign*Trunc(angle);
  88.           end; {0}
  89.       1 : begin
  90.           angle := Modulus(angle + 1/12,360);
  91.           deg := Trunc(angle);
  92.           min := Trunc((angle - deg) * 6)*10;
  93.           deg := asign*deg;
  94.           end; {1}
  95.       2 : begin
  96.           angle := Modulus(angle + 1/120,360);
  97.           deg := Trunc(angle);
  98.           min := Trunc((angle - deg) * 60);
  99.           deg := asign*deg;
  100.           end; {2}
  101.       3 : begin
  102.           angle := Modulus(angle + 1/720,360);
  103.           deg := Trunc(angle);
  104.           tmp := (angle - deg) * 60;
  105.           min := Trunc(tmp);
  106.           sec := Trunc(Frac(tmp)*6)*10;
  107.           deg := asign*deg;
  108.           end; {3}
  109.       4 : begin
  110.           angle := Modulus(angle + 1/7200,360);
  111.           deg := Trunc(angle);
  112.           tmp := (angle - deg) * 60;
  113.           min := Trunc(tmp);
  114.           sec := Trunc(Frac(tmp)*60);
  115.           deg := asign*deg;
  116.           end; {4}
  117.       end; {case}
  118.     if degrees then
  119.       case dec of
  120.           0 : Write(fout,deg:width,'°');
  121.         1,2 : Write(fout,deg:width,'°',TwoDigit(min),'''');
  122.         3,4 : Write(fout,deg:width,'°',TwoDigit(min),'''',TwoDigit(sec),'"');
  123.         end {case}
  124.     else
  125.       case dec of
  126.           0 : Write(fout,deg:width,'h');
  127.         1,2 : Write(fout,deg:width,'h',TwoDigit(min),'m');
  128.         3,4 : Write(fout,deg:width,'h',TwoDigit(min),'m',TwoDigit(sec),'s');
  129.         end {case}
  130.     end {if}
  131.   else
  132.     if dec = 0 then
  133.       Write(fout,angle:width:0)
  134.     else
  135.       Write(fout,angle:width+dec+1:dec);
  136.   end; {Procedure Output_Angle}
  137.  
  138. Procedure Output_LatLonAlt(time : double;
  139.                        geodetic : vector);
  140.   begin
  141.   Output_Time(time);
  142.   if N_E_W_S then
  143.     begin
  144.     Output_Angle(Abs(Degrees(geodetic[1])),5,angle_res,true);
  145.     if geodetic[1] >= 0 then
  146.       Write(fout,' N')
  147.     else
  148.       Write(fout,' S');
  149.     if geodetic[2] > pi then
  150.       geodetic[2] := geodetic[2] - twopi;
  151.     Output_Angle(Abs(Degrees(geodetic[2])),6,angle_res,true);
  152.     if geodetic[2] >= 0 then
  153.       Write(fout,' E')
  154.     else
  155.       Write(fout,' W');
  156.     end {if}
  157.   else
  158.     begin
  159.     Output_Angle(Degrees(geodetic[1]),5,angle_res,true);
  160.     Output_Angle(Degrees(geodetic[2]),6,angle_res,true);
  161.     end; {if}
  162.   Write(fout,geodetic[3]:11:3);
  163.   if show_vis then
  164.     if eclipsed then
  165.       Writeln(fout,' ECL')
  166.     else
  167.       Writeln(fout,'    ')
  168.   else
  169.     Writeln(fout);
  170.   end; {Procedure Output_LatLonAlt}
  171.  
  172. Procedure Output_Obs(time : double;
  173.                       obs : vector);
  174.   const
  175.     first : boolean = false;
  176.   begin
  177.   if not visible then
  178.     begin
  179.     if first then Writeln(fout);
  180.     first := false;
  181.     Exit;
  182.     end; {if}
  183.   first := true;
  184.   Output_Time(time);
  185.   Write(fout,Copy(obs_name,1,3):5);
  186.   Writeln(fout,Degrees(obs[1]):angle_res+6:angle_res,
  187.                Degrees(obs[2]):angle_res+5:angle_res,
  188.                obs[3]:dist_res+8:dist_res,
  189.                obs[4]:dist_res+8:dist_res+3);
  190.   end; {Procedure Output_Obs}
  191.  
  192. Procedure Output_RADec(time : double;
  193.                         obs : vector);
  194.   const
  195.     first : boolean = false;
  196.   begin
  197.   if not visible then
  198.     begin
  199.     if first then Writeln(fout);
  200.     first := false;
  201.     Exit;
  202.     end; {if}
  203.   first := true;
  204.   Output_Time(time);
  205.   Write(fout,Copy(obs_name,1,3):5);
  206.   Output_Angle(Degrees(obs[1])/15,4,angle_res,false);
  207.   Output_Angle(Degrees(obs[2]),5,angle_res,true);
  208.   Writeln(fout);
  209.   end; {Procedure Output_RADec}
  210.  
  211. end.
  212.